package com.pet.serve.repository;

import com.pet.serve.entity.Goods;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;

@Repository
public interface GoodsRepository extends JpaRepository<Goods, Long> {



    // 搜索商品 - 按价格区间查找
    Page<Goods> findByPriceBetween(BigDecimal minPrice, BigDecimal maxPrice, Pageable pageable);

    // 搜索商品 - 按名称模糊搜索
    Page<Goods> findByNameContaining(String name, Pageable pageable);

    // 搜索商品 - 按商品种类查找
    Page<Goods> findByType(String type, Pageable pageable);

    // 获取用户收藏的商品列表
    Page<Goods> findFavoriteGoodsByUsername(String username, Pageable pageable);


    // 通过 ID 批量删除多个商品
    @Transactional
    void deleteByGoodidIn(List<Long> goodIds);

    // 更新商品状态
    @Modifying
    @Transactional
    @Query("UPDATE Goods g SET g.status = :status WHERE g.goodid = :goodid")
    void updateGoodsStatus(Long goodid, String status);

    /**
     * 一种自定义的查询方法
     * 用于按名称、类型和状态进行搜索
     * 支持部分匹配和空字段，以实现灵活的查询
     *
     * @param name   商品名称
     * @param type   商品种类
     * @param status 商品状态
     * @return 商品列表
     */
    @Query("SELECT g FROM Goods g WHERE " +
            "(COALESCE(:name, '') = '' OR g.name LIKE %:name%) AND " +
            "(COALESCE(:type, '') = '' OR g.type = :type) AND " +
            "(COALESCE(:status, '') = '' OR g.status = :status)")
    List<Goods> searchGoods(String name, String type, String status);

    // 检查库存（商品数量）
    @Query("SELECT CASE WHEN COUNT(g) > 0 THEN true ELSE false END FROM Goods g WHERE g.goodid = :goodid AND g.num >= :num")
    boolean checkNum(@Param("goodid") Long goodid, @Param("num") Integer num);

    // 批量导入商品
    <S extends Goods> List<S> saveAll(Iterable<S> entities);

    // 查询最新上架的前10个商品，按 createtime 降序排列
    List<Goods> findTop10ByStatusOrderByCreateTimeDesc(String status);


    Page<Goods> findByStatus(String status, Pageable pageable);
}
